home *** CD-ROM | disk | FTP | other *** search
/ Die Speccy' 97 / Die Speccy' 97.iso / amiga_system / the_aminet / comm / bbs / bbbbs85.lha / rexx / bbsQUICKOUT.rexx < prev    next >
OS/2 REXX Batch file  |  1994-11-22  |  15KB  |  553 lines

  1. /* $VER: bbsQUICKOUT.rexx 8.3 (22.11.94)
  2. Copyright ⌐ 1994 Richard Lee Stockton
  3. FREELY DISTRIBUTABLE AS LONG AS THIS NOTICE REMAINS
  4. Gathers and archives all NEW mail, messages, and file descriptions
  5. into an emailfile called QUICK_n.lha for later download.
  6. */
  7.  
  8. CR='0D'x
  9. LF='0A'x
  10.  
  11. SIGNAL ON ERROR
  12. SIGNAL ON SYNTAX
  13. SIGNAL ON FAILURE
  14. OPTIONS FAILAT 666
  15.  
  16. PARSE ARG name level lastbrowse sincedate excludelist 
  17.  
  18. bps=GETCLIP('BBS_QUICKOUT_BAUD')
  19. CALL SETCLIP('BBS_QUICKOUT_BAUD')
  20.  
  21. figarg='s:CONFIG.BBS'
  22. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  23. x=OPEN(f,figarg,'R')
  24. IF x=0 THEN
  25.   DO
  26.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  27.     CALL GETOUT(20)
  28.   END
  29. lynes.=''
  30. DO i=1 TO 25
  31.   lynes.i=READLN(f)
  32. END
  33. CALL CLOSE(f)
  34. compos=POS('/*',lynes.1)
  35. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  36. bbsname=STRIP(lynes.1)
  37. sysop=WORD(lynes.2,1)
  38. sysoplevel=WORD(lynes.5,1)
  39. bbspath=WORD(lynes.6,1)
  40. testchar=RIGHT(bbspath,1)
  41. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  42. IF name='' THEN name=sysop
  43. IF WORD(lynes.25,1)=1 THEN scratch=bbspath'Scratch'
  44. ELSE scratch='RAM:Scratch'
  45.  
  46. /* wait up to 5 minutes for QUICKIN to finish processing */
  47.  
  48. DO i=1 TO 100 WHILE GETCLIP('BBS_'name)='QUICKIN'
  49.   CALL DELAY(150)
  50. END
  51.  
  52. /* Should only be one QUICKOUT process at a time per user */
  53.  
  54. IF GETCLIP('BBS_'name)='QUICK' THEN EXIT
  55.  
  56. sendline=RIGHT(TIME('C'),7) LEFT(DATE(),6)' OUT' name
  57. ADDRESS AREXX bbsLog99.rexx 'QUICK' sendline
  58. x=countcheck('Numbers/QUICKOUT' 0)
  59. CALL countcheck('Numbers/QUICKOUT' x+1)
  60.  
  61. CALL CLOSE(STDOUT)
  62. IF OPEN(STDOUT,scratch'/QUICKOUT.STDOUT','W')=0 THEN
  63.   DO i=1 WHILE OPEN(STDOUT,scratch'/QUICKOUT.STDOUT.'i,'W')=0
  64.   END
  65. SAY STRIP(SUBSTR(SOURCELINE(1),10))
  66. SAY name DATE() TIME('C')
  67. SAY
  68. CALL PRAGMA('P',-1)
  69. CALL TIME('R')
  70. CALL SETCLIP('BBS_'name,'QUICK')
  71. DO i=1
  72.   IF GETCLIP('BBS_QUICKOUT'i)='' THEN  /* info clip for external STOP */
  73.     DO
  74.       CALL SETCLIP('BBS_QUICKOUT'i,name)
  75.       clipnum=i
  76.       LEAVE i
  77.     END
  78. END
  79. CALL MAKEDIR(bbspath'EmailFiles/'name)
  80. IF level='' THEN
  81.   DO
  82.     level=99
  83.     x=OPEN(f,bbspath'Users/'name,'R')
  84.     IF x=0 THEN EXIT 22
  85.     data.=''
  86.     DO i=1
  87.       line=READLN(f)
  88.       IF EOF(f) THEN LEAVE i
  89.       data.i=line
  90.     END
  91.     data.0=i-1
  92.     CALL CLOSE(f)
  93.     city=docity(data.3)
  94.     data.13=DATE('S')'  'TIME('C')
  95.     lastbrowse=WORD(data.16,1)
  96.     sincedate=WORD(data.16,2)
  97.     IF FIND(noquick,'FILELIST')=0 THEN
  98.       data.16=countcheck('Numbers/LastFile' 0) DATE('S') TIME()
  99.     excludelist=data.21
  100.     IF FIND(noquick,'MESSAGES')=0 THEN
  101.       DO
  102.         CALL SETCLIP('BBS_'name'_22',data.22)
  103.         temp=''
  104.         DO i=1 TO level
  105.           IF WORD(data.22,i)=-1 THEN temp=STRIP(temp -1)
  106.           ELSE temp=STRIP(temp countcheck('Numbers/LastMessage'i 0))
  107.         END
  108.         data.22=temp
  109.       END
  110.     noquick=UPPER(data.26)
  111.     x=OPEN(f,bbspath'Users/'name,'W')
  112.     IF x~=0 THEN
  113.       DO i=1 TO data.0
  114.         CALL WRITELN(f,data.i)
  115.       END
  116.     CALL CLOSE(f)
  117.   END
  118. ELSE
  119.   DO
  120.     city=GETCLIP('BBS_city')
  121.     CALL SETCLIP('BBS_city')
  122.     noquick=UPPER(GETCLIP('BBS_'name'_26'))
  123.     CALL SETCLIP('BBS_'name'_26')
  124.   END
  125.  
  126. IF ~EXISTS(bbspath'Users/'name) THEN CALL GETOUT(21)
  127. CALL check_abort()
  128.  
  129. IF FIND(noquick,'MESSAGES')=0 THEN CALL ArcMsgs.rexx(name)
  130. CALL check_abort()
  131.  
  132. x=OPEN(f,bbspath'Numbers/LastMail','R')
  133. IF x=0 THEN CALL GETOUT(27)
  134. lastm=READLN(f)+1
  135. CALL CLOSE(f)
  136. ADDRESS COMMAND 'ECHO >'bbspath'Numbers/LastMail 'lastm
  137.  
  138.  
  139. /* Make an ID file for the archive(s) */
  140.  
  141. x=OPEN(f,bbspath'EmailFiles/'name'/.ID','W')
  142. IF x=0 THEN CALL GETOUT(22)
  143. CALL WRITELN(f,' USER:' name)
  144. CALL WRITELN(f,' CITY:' city)
  145. CALL WRITELN(f,'  BBS:' bbsname)
  146. CALL WRITELN(f,'SYSOP:' sysop)
  147. CALL WRITELN(f,' DATE:' TIME('C') DATE())
  148. CALL WRITELN(f,' KEYS:' lastm level sysoplevel TIME('E'))
  149. CALL WRITELN(f,'')
  150. CALL CLOSE(f)
  151. comm='CD' bbspath'EmailFiles/'name LF 'lha -2amN m'
  152. comm=comm 'QUICK_'lastm'.lha .ID'
  153. SAY comm
  154. ADDRESS COMMAND comm
  155.  
  156.  
  157. /* add Messages, Libraries, and Conferences to archive */
  158.  
  159. frn=bbspath'Friends/'name
  160. IF EXISTS(frn) THEN
  161.   ADDRESS COMMAND 'c:copy' frn bbspath'EmailFiles/'name'/Friends'
  162.  
  163. CALL PRAGMA('D',bbspath'EmailFiles/'name)
  164. nlist=''
  165. IF EXISTS('Conferences') THEN nlist='Conferences'
  166. IF EXISTS('Libraries') THEN nlist=STRIP(nlist 'Libraries')
  167. IF EXISTS('Friends') THEN nlist=STRIP(nlist 'Friends')
  168. IF EXISTS('Marked') THEN nlist=STRIP(nlist 'Marked')
  169. CALL strip_ansi(bbspath'EmailFiles/'name nlist)
  170. IF EXISTS('Messages') THEN nlist=STRIP(nlist 'Messages')
  171. comm='CD' bbspath'EmailFiles/'name LF 'lha -2amN m'
  172. comm=comm 'QUICK_'lastm'.lha'
  173. SAY comm
  174. SAY nlist
  175. ADDRESS COMMAND comm nlist
  176. CALL check_abort()
  177.  
  178.  
  179. /* gather and archive email and emailfiles */
  180.  
  181. mailfiles=''
  182. email=SHOWDIR(bbspath'Email/'name)
  183. DO i=1 TO WORDS(email)
  184.   x=OPEN(f,bbspath'Email/'name'/'WORD(email,i),'R')
  185.   IF x=0 THEN ITERATE i
  186.   line=READLN(f)
  187.   CALL CLOSE(f)
  188.   file=WORD(line,4)
  189.   IF file='' | ~EXISTS(bbspath'EmailFiles/'name'/'file) THEN ITERATE i
  190.   IF LEFT(UPPER(file),6)='QUICK_' THEN ITERATE i
  191.   IF WORD(STATEF(bbspath'EmailFiles/'name'/'file),2)>0 THEN
  192.     DO
  193.       mailfiles=STRIP(mailfiles 'EmailFiles/'name'/'file)
  194.       xdl=bbspath'EmailFiles/'name'/'file'.xdl'
  195.       IF EXISTS(xdl) THEN
  196.         CALL RENAME(xdl,bbspath'EmailFiles/'name'/QUICK_'lastm'.lha.xdl')
  197.     END
  198. END
  199.  
  200. CALL check_abort()
  201. IF mailfiles~='' THEN
  202.   DO
  203.     comm='CD' bbspath LF 'lha -2axmN m'
  204.     comm=comm 'EmailFiles/'name'/QUICK_'lastm'.lha' mailfiles
  205.     SAY comm
  206.     ADDRESS COMMAND comm
  207.   END
  208. SAY
  209.  
  210. CALL check_abort()
  211. IF email~='' THEN
  212.   DO
  213.     CALL strip_ansi(bbspath'Email/'name email)
  214.     comm='CD' bbspath LF 'lha -2axmN m'
  215.     comm=comm 'EmailFiles/'name'/QUICK_'lastm'.lha Email/'name'/#?'
  216.     SAY comm
  217.     ADDRESS COMMAND comm
  218.   END
  219. SAY
  220.  
  221.  
  222. /* Gather WELCOME(s), UNTIL(s), GOODBYE and all
  223.    new Information files into "Notices" drawer */
  224.  
  225. CALL check_abort()
  226. CALL MAKEDIR(bbspath'EmailFiles/'name'/Notices')
  227.  
  228. ulist=''
  229. IF FIND(noquick,'HELLO')=0 & EXISTS(bbspath'BBS_TEXT/HELLO') THEN
  230.   ulist='HELLO'
  231. IF FIND(noquick,'WELCOME')=0 & EXISTS(bbspath'BBS_TEXT/WELCOME') THEN
  232.   ulist=STRIP(ulist 'WELCOME')
  233. arg='WELCOME.'RIGHT(DATE('S'),4)
  234. IF EXISTS(bbspath'BBS_TEXT/'arg) THEN ulist=STRIP(ulist arg)
  235. arg='WELCOME.'LEFT(DATE('W'),3)
  236. IF EXISTS(bbspath'BBS_TEXT/'arg) THEN ulist=STRIP(ulist arg)
  237. IF FIND(noquick,'GOODBYE')=0 & EXISTS(bbspath'BBS_TEXT/GOODBYE') THEN
  238.   ulist=STRIP(ulist 'GOODBYE')
  239. IF FIND(noquick,'BAUD.'bps)=0 & EXISTS(bbspath'BBS_TEXT/BAUD.'bps) THEN
  240.   ulist=STRIP(ulist 'BAUD.'bps)
  241. untils.=''
  242. IF FileList(bbspath'BBS_TEXT/UNTIL.*',untils)>0 THEN
  243.   DO ui=1 TO untils.0
  244.     IF RIGHT(untils.ui,8)<DATE('S') THEN ITERATE ui
  245.     ELSE ulist=STRIP(ulist untils.ui)
  246.   END
  247. DROP untils.
  248. levels.=''
  249. IF FileList(bbspath'BBS_TEXT/LEVEL.*',levels)>0 THEN
  250.   DO ui=1 TO levels.0
  251.     p=LASTPOS('.',levels.ui)
  252.     x=SUBSTR(levels.ui,p+1)
  253.     PARSE VAR x lo'-'hi .
  254.     IF ~DATATYPE(lo,'W') | ~DATATYPE(hi,'W') THEN ITERATE ui
  255.     IF lo>level | hi<level THEN ITERATE ui
  256.     ulist=STRIP(ulist levels.ui)
  257.   END
  258. DROP levels.
  259.  
  260. CALL check_abort()
  261. DO i=1 TO WORDS(ulist)
  262.   comm='CD' bbspath'BBS_TEXT'LF'copy'
  263.   comm=comm WORD(ulist,i) bbspath'EmailFiles/'name'/Notices'
  264.   ADDRESS COMMAND comm
  265. END
  266.  
  267. CALL check_abort()
  268. ulist=''
  269. dm=DATE(,sincedate,'S')
  270. PARSE VAR dm da' 'mo' 'yr .
  271. yr=RIGHT(yr,2)
  272. sincedate=da'-'mo'-'yr
  273. arg=bbspath'Information'
  274. ADDRESS COMMAND 'C:LIST >'scratch'/infolist' arg 'NOHEAD DATES SINCE' sincedate
  275. IF WORD(STATEF(scratch'/infolist'),2)>3 THEN
  276.   DO
  277.     x=OPEN(f,scratch'/infolist','R')
  278.     IF x=0 THEN SAY scratch'infolist failed to open for reading!'
  279.     ELSE
  280.       DO i=1
  281.         line=READLN(f)
  282.         IF EOF(f) THEN LEAVE i
  283.         IF LEFT(line,1)=':' THEN ITERATE i
  284.         fyle=WORD(line,1)
  285.         IF FIND(noquick,UPPER(fyle))>0 THEN ITERATE i
  286.         ulist=STRIP(ulist fyle)
  287.         readcount=STATEF(bbspath'Information/'fyle)
  288.         readcount=WORD(readcount,8)
  289.         IF ~DATATYPE(readcount,'W') THEN readcount=0
  290.         ADDRESS COMMAND 'C:filenote' bbspath'Information/'fyle readcount+1
  291.       END
  292.     CALL CLOSE(f)
  293.   END
  294.  
  295. CALL check_abort()
  296. DO i=1 TO WORDS(ulist)
  297.   comm='CD' bbspath'Information'LF'copy'
  298.   comm=comm WORD(ulist,i) bbspath'EmailFiles/'name'/Notices'
  299.   ADDRESS COMMAND comm
  300. END
  301.  
  302. CALL check_abort()
  303. IF FIND(noquick,'STATS.BBS')=0 THEN CALL bbsSTATS.rexx(name 0)
  304. IF FIND(noquick,'HOURLY')=0 THEN CALL ShowHourly.rexx(name 99 0)
  305.  
  306. CALL check_abort()
  307. IF level>=sysoplevel THEN
  308.   DO
  309.     ADDRESS COMMAND 'info >'bbspath'EmailFiles/'name'/Notices/Info_Devs'
  310.     ADDRESS COMMAND 'rxset >'bbspath'EmailFiles/'name'/Notices/Info_Clips'
  311.     ADDRESS COMMAND 'avail >'bbspath'EmailFiles/'name'/Notices/Info_Memory'
  312.     temp=bbspath'Lists/NEW_USERS'
  313.     IF EXISTS(temp) THEN
  314.       ADDRESS COMMAND 'copy' temp bbspath'EmailFiles/'name'/Notices'
  315.     temp=bbspath'Lists/CBV_USERS'
  316.     IF EXISTS(temp) THEN
  317.       ADDRESS COMMAND 'copy' temp bbspath'EmailFiles/'name'/Notices'
  318.   END
  319.  
  320. CALL check_abort()
  321. IF WORDS(bbspath'EmailFiles/'name'/Notices')>0 THEN
  322.   DO
  323.     temp=bbspath'EmailFiles/'name'/Notices'
  324.     CALL strip_ansi(temp SHOWDIR(temp))
  325.     comm='CD' bbspath'EmailFiles/'name||LF'lha -2axmN m'
  326.     comm=comm bbspath'EmailFiles/'name'/QUICK_'lastm'.lha Notices/#?'
  327.     SAY comm
  328.     ADDRESS COMMAND comm
  329.   END
  330.  
  331.  
  332. /* archive NEW file descriptions by date */
  333.  
  334. CALL check_abort()
  335. IF FIND(noquick,'FILELIST')=0 THEN
  336.   DO
  337.     x=OPEN(f,bbspath'Lists/Libraries','R')
  338.     IF x=0 THEN
  339.       DO
  340.         SAY 'Libraries list did not open!'
  341.         CALL GETOUT(26)
  342.       END
  343.     libs.=''
  344.     liblist=''
  345.     DO i=1
  346.       line=READLN(f)
  347.       IF EOF(f) | line='END' THEN LEAVE i
  348.       num=WORD(line,1)
  349.       lib=WORD(line,2)
  350.       IF DATATYPE(num,'N') THEN
  351.         DO
  352.           num=num%1
  353.           IF num>0 & num<=level THEN
  354.             DO
  355.               IF FIND(UPPER(excludelist),UPPER(lib))=0 THEN
  356.                 liblist=STRIP(liblist lib)
  357.             END
  358.         END
  359.     END
  360.     CALL CLOSE(f)
  361.     CALL ArcBrowse.rexx(name lastbrowse 'D A' liblist)
  362.   END
  363.  
  364.  
  365. /* add FileList to archive */
  366.  
  367. CALL check_abort()
  368. IF EXISTS('FileList') THEN
  369.   DO
  370.     comm='CD' bbspath'EmailFiles/'name LF 'lha -2amN m'
  371.     comm=comm 'QUICK_'lastm'.lha FileList'
  372.     SAY comm
  373.     ADDRESS COMMAND comm
  374.   END
  375. ELSE IF EXISTS('List1') THEN
  376.   DO i=1 WHILE EXISTS('List'i)
  377.     comm='CD' bbspath'EmailFiles/'name LF 'lha -2amN m'
  378.     comm=comm 'QUICK_'lastm'.lha List'i
  379.     SAY comm
  380.     ADDRESS COMMAND comm
  381.   END
  382. CALL check_abort()
  383.  
  384.  
  385. /* If user is still online, write email and signal */
  386.  
  387. IF GETCLIP('BBS_level')~='' & WORD(GETCLIP('BBS_lastcaller'),1)=name THEN
  388.   DO
  389.     x=OPEN(f,bbspath'Email/'name'/BBBBS.'lastm,'W')
  390.     IF x=0 THEN CALL GETOUT(26)
  391.     CALL WRITELN(f,' Mail: 'lastm'   FILE: QUICK_'lastm'.lha')
  392.     CALL WRITELN(f,' From: BBBBS')
  393.     CALL WRITELN(f,'   To: 'name)
  394.     CALL WRITELN(f,' Subj: BBS activity since your last call.')
  395.     CALL WRITELN(f,' Date: 'DATE('W') DATE() TIME('C'))
  396.     CALL WRITELN(f,LEFT('=',75,'='))
  397.     CALL WRITELN(f,'Here is the QUICK archive you requested.')
  398.     CALL CLOSE(f)
  399.     oldmess=GETCLIP('BBS_MESSAGE')
  400.     IF oldmess~='' THEN oldmess=oldmess||'0D0A'x
  401.     newmess='Your QUICK archive is waiting in Email.'
  402.     CALL SETCLIP('BBS_MESSAGE',oldmess||newmess)
  403.   END
  404. SAY 'QUICKOUT archive for' name 'sucessfully completed at' TIME('C')
  405. temp=''
  406. secs=TIME('E')
  407. mins=secs%60
  408. hrs=mins%60
  409. secs=(secs//60)%1
  410. mins=mins//60
  411. IF hrs=1 THEN temp='1 hour'
  412. ELSE IF hrs>0 THEN temp=hrs 'hours'
  413. IF mins=1 THEN temp=temp '1 minute'
  414. ELSE IF mins>0 THEN temp=temp mins 'minutes'
  415. IF secs=1 THEN temp=temp '1 second'
  416. ELSE IF secs>0 THEN temp=temp secs 'seconds'
  417. temp=STRIP(temp)
  418. tstamp=hrs':'
  419. IF mins<10 THEN tstamp=tstamp'0'
  420. tstamp=tstamp||mins':'
  421. IF secs<10 THEN tstamp=tstamp'0'
  422. tstamp=LEFT(tstamp||secs,9)
  423. bytes=WORD(STATEF(bbspath'EmailFiles/'name'/QUICK_'lastm'.lha'),2)
  424. SAY ' -' temp 'to process this' bytes 'byte archive - '
  425. SAY
  426. sendline=RIGHT(TIME('C'),7) LEFT(DATE(),6)' OUT Elapsed:'
  427. sendline=sendline tstamp||RIGHT(bytes,8) 'bytes for' name
  428. ADDRESS AREXX bbsLog99.rexx 'QUICK' sendline
  429. CALL GETOUT(0)
  430. EXIT
  431.  
  432.  
  433. GETOUT:
  434. ARG err 
  435. IF err>0 THEN SAY 'Error:' err'  'ERRORTEXT(RC) 'RC='RC'  LINE#='SIGL
  436. ERROR:
  437. SYNTAX:
  438. FAILURE:
  439. IF RC>0 THEN SAY 'RC='RC'  SIGL='SIGL
  440. IF GETCLIP('BBS_'name)='QUICK' THEN CALL SETCLIP('BBS_'name)
  441. CALL SETCLIP('BBS_QUICKOUT'clipnum)
  442. CALL DELETE(bbspath'EmailFiles/'name'/Notices')
  443. EXIT err
  444.  
  445.  
  446. check_abort:
  447. t=GETCLIP('BBS_STOP_QUICKOUT'clipnum)
  448. IF t='' THEN RETURN
  449. CALL SETCLIP('BBS_STOP_QUICKOUT'clipnum)
  450. SAY 'Aborted at' TIME('C')
  451. IF t='DELETE' THEN
  452.   DO
  453.     CALL DELETE(bbspath'EmailFiles/'name'/QUICK_'lastm'.lha')
  454.     ADDRESS COMMAND 'c:delete' bbspath'EmailFiles/'name'/Notices ALL'
  455.   END
  456. sendline=RIGHT(TIME('C'),7) LEFT(DATE(),6)' OUT' name
  457. sendline=sendline 'ABORTED!'
  458. ADDRESS AREXX bbsLog99.rexx 'QUICK' sendline
  459. CALL GETOUT(0)
  460. RETURN
  461.  
  462.  
  463. strip_ansi:
  464. PARSE ARG path tlist 
  465. IF tlist='' THEN RETURN
  466. olddir=PRAGMA('D',path)
  467. DO j=1 TO WORDS(tlist)
  468.   data.=''
  469.   changed=0
  470.   x=OPEN(f,WORD(tlist,j),'R')
  471.   IF x=0 THEN
  472.     DO
  473.       SAY WORD(tlist,j) 'failed to open to read!'
  474.       ITERATE j
  475.     END
  476.   DO i=1
  477.     line=READLN(f)
  478.     IF EOF(f) THEN LEAVE i
  479.     n=POS('1B'x,line)
  480.     DO WHILE n>0
  481.       DO k=2
  482.         IF DATATYPE(SUBSTR(line,n+k,1),M) | (n+k+1)>LENGTH(line) THEN
  483.           leave k
  484.       END
  485.       line=DELSTR(line,n,k+1)
  486.       n=POS('1B'x,line)
  487.       changed=1
  488.     END
  489.     data.i=line
  490.   END
  491.   data.0=i-1
  492.   CALL CLOSE(f)
  493.   IF changed=0 THEN ITERATE j
  494.   CALL DELAY(50)
  495.   x=OPEN(f,WORD(tlist,j),'W')
  496.   IF x=0 THEN
  497.     DO
  498.       SAY WORD(tlist,j) 'failed to open to write!'
  499.       ITERATE j
  500.     END
  501.   DO i=1 TO data.0
  502.     CALL WRITELN(f,data.i)
  503.   END
  504.   CALL CLOSE(f)
  505. END
  506. CALL PRAGMA('D',olddir)
  507. RETURN
  508.  
  509.  
  510. docity:
  511. PARSE ARG citi
  512. citi=TRANSLATE(citi,'          ','+-.,*/()<>')
  513. DO i=WORDS(citi) TO 1 BY -1
  514.   IF DATATYPE(WORD(citi,i),'N') THEN citi=STRIP(DELWORD(citi,i,1))
  515.   IF UPPER(WORD(citi,i))='USA' THEN citi=STRIP(DELWORD(citi,i,1))
  516. END
  517. citi=SPACE(citi,1)
  518. RETURN STRIP(citi)
  519.  
  520.  
  521. countcheck:
  522. PARSE ARG fname' 'cknum .
  523. fname=bbspath||fname
  524. IF ~EXISTS(fname) THEN
  525.   DO
  526.     IF cknum=0 THEN RETURN 0
  527.     IF OPEN(f,fname,'W')=0 THEN RETURN 0
  528.     CALL WRITELN(f,cknum)
  529.     CALL CLOSE(f)
  530.     RETURN cknum
  531.   END
  532. IF OPEN(f,fname,'R')=0 THEN
  533.   DO
  534.     CALL DELAY(99)
  535.     IF OPEN(f,fname,'R')=0 THEN RETURN cknum
  536.   END
  537. retval=STRIP(READLN(f))
  538. CALL CLOSE(f)
  539. IF ~DATATYPE(retval,'W') THEN retval=0
  540. IF ~DATATYPE(cknum,'W') THEN cknum=0
  541. IF retval<cknum THEN
  542.   DO
  543.     IF OPEN(f,fname,'W')~=0 THEN
  544.       DO
  545.         CALL WRITELN(f,cknum)
  546.         CALL CLOSE(f)
  547.         RETURN cknum
  548.       END
  549.   END
  550. RETURN retval
  551.  
  552. /* bbsQUICKOUT.rexx */
  553.